package top.qform.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * jdk动态代理类
 */
public class JDKProxy implements InvocationHandler {

    /**
     * 目标类
     */
    private Object targetObject;

    /**
     * 获取代理对象
     *
     * @param targetObject 目标类
     * @return 获取代理
     */
    public Object newProxyInstance(Object targetObject) {
        this.targetObject = targetObject;
        // 绑定关系，也就是和具体的那个实现类关联
        return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), // 指明一个类加载器，为了操作class文件
                // 为代理对象指定要是实现哪些接口，这里要为PayServiceImpl这个目标对象创建动态代理，所以需要为代理对象指定实现PayService接口
                // 因为知道具体的，所以下面可以直接替换为 new Class[]{PayService.class}
                targetObject.getClass().getInterfaces(),
                this);
    }

    /**
     * JDK动态代理
     *
     * @param proxy  静态代理对象
     * @param method 要调用的方法
     * @param args   方法调用时所需要参数
     * @return 结果
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) {
        Object result = null;
        try {
            System.out.println("通过JDK动态代理调用" + method.getName() + ",打印日志 begin");
            result = method.invoke(targetObject, args);
            System.out.println("通过JDK动态代理调用" + method.getName() + ",打印日志 end");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}
